<?php
/**
 * Lớp hỗ trợ sử dụng SESSION
 * @author Mr.UBKey
 *
 * Sử dụng phương thức tĩnh getInstance() để lấy ra một đối tượng
 */
class XPHP_Session
{
    const SESSION_STARTED = TRUE;
    const SESSION_NOT_STARTED = FALSE;
    
    /**
     * Lưu trạng thái Session hiện tại
     * @var bool
     */
    private $sessionState = self::SESSION_NOT_STARTED;
    
    /**
     * Thể thiện của Session
     * @var XPHP_Session
     */
    private static $instance;
    
    
    private function __construct() {}
    
    
    /**
    * Trả về thể hiện của lớp 'Session'.
    * Session sẽ tự động khởi tạo mà không cần (Re)starts nó
    *    
    * @return XPHP_Session
    */
    public static function getInstance()
    {
        if (!isset(self::$instance))
        {
            self::$instance = new self;
        }
        
        self::$instance->startSession();
        
        return self::$instance;
    }
    
    
   /**
    * (Re)starts session.
    *    
    * @return bool TRUE nếu session được khởi tạo thành công, ngược lại FALSE.
    */    
    public function startSession()
    {
        if ( $this->sessionState == self::SESSION_NOT_STARTED )
        {
            $this->sessionState = session_start();
        }
        
        return $this->sessionState;
    }
    
    
   /**
    * Lưu trữ dữ liệu trong session.
    * VD: $instance->foo = 'bar';
    *    
    * @param name Tên của dữ liệu.
    * @param value Dữ liệu được lưu trữ.
    * @return void
    */   
    public function __set( $name , $value )
    {
        $_SESSION[$name] = $value;
    }
    
    
   /**
    * Lấy dữ liệu từ session.
    * VD: echo $instance->foo;
    *    
    * @param name Tên của dữ liệu.
    * @return mixed Dữ liệu được lưu trong session.
    */
    public function __get( $name )
    {
        if ( isset($_SESSION[$name]))
        {
            return $_SESSION[$name];
        }
    }
    
    
    public function __isset( $name )
    {
        return isset($_SESSION[$name]);
    }
    
    
    public function __unset( $name )
    {
        unset( $_SESSION[$name] );
    }
    
    
   /**
    * Hủy session hiện tại
    *    
    * @return bool TRUE là session đã bị xóa, ngược lại FALSE.
    */
    public function destroy()
    {
        if ( $this->sessionState == self::SESSION_STARTED )
        {
            $this->sessionState = !session_destroy();
            unset( $_SESSION );
            
            return !$this->sessionState;
        }
        
        return FALSE;
    }
}